﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections;
using System.Runtime.InteropServices;
namespace Lesson1__练习题
{
    class BagMgr   //背包管理类

    {
        private int money;
        private ArrayList items;
        public BagMgr(int money)    //构造函数
        {
            this.money = money;      //构造函数 初始化成员变量
            items = new ArrayList();  //初始化
        }
        public void BuyItem(Item item)  //执行买物品逻辑   调用Item类中的成员‘’‘’‘；
        {
            if(item.money <= 0||item.num<0)   //判断价格是否为负数,数量是否为负数 
            {
                Console.WriteLine("请输入正确的购买信息");
                return; //不进行后面的逻辑'
            }
            //考虑是否带够足够钱
            if(money < item.money * item.num)  
            {
                Console.WriteLine("钱不够");
                return;  //不执行该方法  
            }
            //买完物品后的钱有多少 
            this.money = money - item.num * item.money;
            //判断购买的商品是否叠加如果可以叠加，则增加购买的数量
            Console.WriteLine("购买的商品为{0}购买商品的数量为{Lesson8-Dictionary},购买商品的价格为{2},购买后剩余的金额为{3}",item.name,item.num,item.money,money);
            for (int i = 0; i < items.Count; i++)  //执行叠加逻辑
            {
                if ((items[i] as Item).name == item.name)
                {
                    if((items[i] as Item).num == item.num)    //如果够买的商品背包中已经有 则执行叠加逻辑
                    {
                        (items[i] as Item).num += item.num;
                        return;
                    }
                   
                }
                
            }
            items.Add(item);   //不能叠加，则直接添加
        }
        public void SellItem(Item item)  //出售商品逻辑   建立在背包中不会出现容器中出现两个item的情况
        {
     
            for (int i = 0; i < items.Count; i++)
            {
                if ((items[i] as Item).id == item.id)  //判断背包中是否有要买的商品    
                {

                    int num = 0;  //记录出售商品的数量
                    //判断背包中是否有要买的商品
                    //利用背包商品id唯一性进行判断
                    string name = (items[i] as Item).name;
                    int money = (items[i] as Item).money;//这段C#代码的作用是从一个名为items的数组或列表中获取第i个元素，并将其转换为Item类型，然后访问该Item对象的money属性，并将该属性的值赋给一个名为money的整数变量。
                    if ((items[i] as Item).num > item.num)  //判断出售商品的数量是否大于背包中商品的数量
                    {
                        num = item.num;
                    }
                    else 
                    {
                        num = (items[i] as Item).num;   //卖完了就从身上移出来
                        items.RemoveAt(i);      //移除出售的商品
                    }
                    int sellMoney = (int)(num * money * 0.8f);  //出售商品的价格
                    this.money += sellMoney;
                    Console.WriteLine("卖了{0}{Lesson8-Dictionary}个赚了{2}元", name, num, sellMoney);
                    Console.WriteLine("目前拥有{0}钱", this.money);
                    return;   //一但卖出成功，程序将立即退出当前方法或函数
                }
            }
        

        }
        public void ShowItem()  //显示背包中的物品
        {
            Item item;
            for (int i = 0;i<items.Count;i++)
            {
                item = items[i] as Item;
                Console.WriteLine("{0}{Lesson8-Dictionary}个", item.name, item.num);
                Console.WriteLine("当前金额为{0}", this.money);
            }
     
        }

      

        
    }
class Item   //物品类     
    {
        //用来表示商品信息
        public int id ;     //商品id,一般在游戏制作时会给一个特定的id
        public int num;     //商品数量
        public string name;   //商品名称
        public int money;    //传入商品单价

        public Item(int id, int num, string name, int money)
        {
            this.id = id;
            this.num = num;
            this.name = name;
            this.money = money;
        }   
    }
    internal class Program
    {
        static void Main(string[] args)
        {
            #region 请简述 ArrayList 和数组的区别
            //ArrayList 是动态数组，数组是静态数组   
            //ArrayList 可以存储任意类型的数据，数组只能存储相同类型的数据
            //ArrayList 可以动态改变大小，数组大小固定 

            #endregion

            #region  创建一个背包管理类，使用ArrayLIst存储背包中的物品，背包中物品有名称和数量，请实现以下功能： 
            BagMgr bag = new BagMgr(999);   //初始化背包中金额

            Item i1 = new Item(1, 1, "苹果", 10);

            Item i2 = new Item(2, 1, "香蕉", 20);

            Item i3 = new Item(3, 1, "橙子", 30);
            


            bag.BuyItem(i1);   //购买商品

            bag.BuyItem(i2);   //购买商品

            bag.BuyItem(i3);   //购买商品

            bag.SellItem(i1);  //出售商品

         



            #endregion
        }
    }
}
